package cn.liulin.java8.stream;

import com.alibaba.fastjson.JSON;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * cn.liulin.java8.stream$
 *
 * @author ll
 * @date 2021-10-13 17:34:21
 **/
public class StreamRun {
    public static void main(String[] args) {
//        runOne();
//        runSecond();
        runThird();
    }

    /**
     * (3) 如何扩展前一个例子，只返回总和能被3整除的数对呢？例如(2, 4)和(3, 3)是可以的。
     * @author ll
     * @date 2021-10-13 17:42:37
     * @return void
     **/
    private static void runThird() {
        List<Integer> integers1 = Arrays.asList(1, 2, 3);
        List<Integer> integers2 = Arrays.asList(3, 4);
        List<int[]> collect = integers1.stream()
                .flatMap(i -> integers2.stream()
                        .filter(j -> (i + j) % 3 == 0)
                        .map(j -> new int[]{i, j}))
                .collect(Collectors.toList());
        System.out.println(JSON.toJSONString(collect));
    }

    /**
     * (2) 给定两个数字列表，如何返回所有的数对呢？例如，给定列表[1, 2, 3]和列表[3, 4]，应该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。为简单起见，你可以用有两个元素的数组来代表数对
     * @author ll
     * @date 2021-10-13 17:36:26
     * @return void
     **/
    private static void runSecond() {
        List<Integer> integers1 = Arrays.asList(1, 2, 3);
        List<Integer> integers2 = Arrays.asList(3, 4);
        List<int[]> collect = integers1.stream()
                .flatMap(i -> integers2.stream()
                        .map(j -> new int[]{i, j}))
                .collect(Collectors.toList());
        System.out.println(JSON.toJSONString(collect));
    }

    /**
     * (1)给定一个数字列表，如何返回一个由每个数的平方构成的列表呢？例如，给定[1, 2, 3, 4, 5]，应该返回[1, 4, 9, 16, 25]。
     * @author ll
     * @date 2021-10-13 17:34:35
     * @return void
     **/
    private static void runOne() {
        List<Integer> integers = Arrays.asList(1, 2, 3, 4, 5);
        List<Integer> collect = integers.stream()
                .map(d -> d * d)
                .collect(Collectors.toList());
        System.out.println(collect);
    }
}
